
/* Faz a estatística dos dados de um arquivo fornecido como argumento. */

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <limits.h>

int main(int argc, char **argv) {
	long int i = 0;
	double somatorio = 0;
	double media;
	double variancia = 0;
	double desviopadrao;
	double *v = (double *) malloc(5000000*sizeof(double)); //limitando o conjunto de dados em no máximo 5 milhões de números
	double menor = INT_MAX, maior = 0;
	long int count = 0;
	char buf[30];
	FILE *fp;

	if (argc != 2) {
		fprintf(stderr, "usage: %s <filename>\n", argv[0]);
		exit(1);
	}
	if ((fp = fopen(argv[1], "r")) == NULL) {
		fprintf(stderr, "Erro ao tentar abrir %s\n", argv[0]);
		exit(1);
	}
	while (fgets(buf, 11, fp)) {
		somatorio += v[count] = atof(buf);
		if (v[count] > maior)
			maior = v[count];
		if (v[count] < menor)
			menor = v[count];
		count++;
	}
	fclose(fp);
	media = somatorio / (double) (count);
	for (i = 0; i < count; i++)
		variancia += pow(v[i] - media, 2);
	variancia /= (double) (count);
	desviopadrao = sqrt(variancia);

	/* Gerando um arquivo (/tmp/estatisticas) com as
	 * "variáveis de ambiente" que acabei de criar */
	fp = fopen("/tmp/variaveisparaognuplot", "w");
	sprintf(buf, "QUANTIDADE=%ld\n", count);	//número de amostras/linhas no arquivo de entrada
	fputs(buf, fp);
	sprintf(buf, "MEDIA=%f\n", media);	//média dos valores contidos no arquivo de entrada
	fputs(buf, fp);
	sprintf(buf, "DESVIOPADRAO=%f\n", desviopadrao);	//desvio padrão dos valores contidos no arquivo de entrada
	fputs(buf, fp);
	sprintf(buf, "VARIANCIA=%f\n", variancia);	//variância dos valores contidos no arquivo de entrada
	fputs(buf, fp);
	sprintf(buf, "MENOR=%f\n", menor);	//menor dos valores do conjunto de dados
	fputs(buf, fp);
	sprintf(buf, "MAIOR=%f\n", maior);	//maior dos valores do conjunto de dados
	fputs(buf, fp);
	sprintf(buf, "DIREITA=%f\n", media + 3 * desviopadrao);	//até que valor plotarei no gnuplot
	fputs(buf, fp);
	sprintf(buf, "ESQUERDA=%f\n", media - desviopadrao);	//a partir de que valor plotarei no gnuplot
	fputs(buf, fp);
	fflush(fp);
	fclose(fp);

	return 0;
}
